package org.example.reflection;

import java.lang.reflect.Field;

/**
 * @author: ZhuYouBin
 * @date: 2022/4/7 11:27
 * @description:
 */
public class FieldDemo {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException,
            InstantiationException, IllegalAccessException {
        // 1、获取Class类对象
        Class<?> clazz = Class.forName("org.example.reflection.Student");
        // 2、创建类对象
        Student student = (Student) clazz.newInstance();
        // 3、获取属性
        Field field = clazz.getDeclaredField("stuProVal");
        // 属性赋值
        field.set(student, "通过反射机制给属性赋值");
        // 获取属性值
        Object value = field.get(student);
        System.out.println(value);
    }
    static void test01() throws ClassNotFoundException, NoSuchFieldException {
        // 1、获取Class类对象
        Class<?> clazz = Class.forName("org.example.reflection.Student");
        // 2、获取类的属性
        // getFields(): 获取当前类、父类中的所有public方法
        Field[] fields = clazz.getFields();
        System.out.println("===== getFields(): 获取当前类、父类中的所有public方法 =====");
        for (Field field : fields) {
            System.out.println(""+field);
        }
        System.out.println();

        // getDeclaredFields(): 获取当前类中的所有方法
        Field[] declaredFields = clazz.getDeclaredFields();
        System.out.println("===== getDeclaredFields(): 获取当前类中的所有方法 =====");
        for (Field declaredField : declaredFields) {
            System.out.println(declaredField);
        }
        System.out.println();

        // getField(String name): 获取当前类、父类中指定名称的一个public属性
        System.out.println("===== getField(String name): 获取当前类、父类中指定名称的一个属性 =====");
        Field pubVal = clazz.getField("pubVal"); // 父类public属性
        System.out.println(pubVal);
        Field stuPubVal = clazz.getField("stuPubVal"); // 子类public属性
        System.out.println(stuPubVal);

        System.out.println();
        // getDeclaredField(String name): 获取当前类中指定名称的一个属性
        System.out.println("===== getDeclaredField(String name): 获取当前类中指定名称的一个属性 =====");
        Field stuPriVal = clazz.getDeclaredField("stuPriVal"); // 子类private属性
        System.out.println(stuPriVal);
    }
}
